home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
text
/
misc
/
MSWordView_src.lha
/
mswordview
/
hyperlink.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-12-14
|
5KB
|
219 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include "config.h"
#include "mswordview.h"
extern FILE *erroroutput;
extern FILE *outputfile;
extern long int cp;
extern long int realcp;
/*this sucks in the bookmark names which will be used for internal hyperlink jumps*/
void decode_bookmarks(FILE *mainfd,FILE *tablefd,textportions *portions)
{
U32 fcSttbfbkmk,lcbSttbfbkmk;
U32 fcPlcfbkf,lcbPlcfbkf;
U32 fcPlcfbkl,lcbPlcfbkl;
fseek(mainfd,0x0142,SEEK_SET);
fcSttbfbkmk = read_32ubit(mainfd);
lcbSttbfbkmk = read_32ubit(mainfd);
error(erroroutput,"table offset for boomarks is %x %d\n",fcSttbfbkmk,lcbSttbfbkmk);
extract_sttbf(&(portions->bookmarks),tablefd,fcSttbfbkmk,lcbSttbfbkmk);
fcPlcfbkf=read_32ubit(mainfd);
lcbPlcfbkf=read_32ubit(mainfd);
fcPlcfbkl=read_32ubit(mainfd);
lcbPlcfbkl=read_32ubit(mainfd);
extract_bookm_limits(&( portions->l_bookmarks),tablefd,fcPlcfbkf,lcbPlcfbkf,fcPlcfbkl,lcbPlcfbkl);
}
/*
this attempts to parse the HYPERLINK field that ms uses to encode
hyperlink information
*/
U16 *decode_hyperlink(int letter, long int *swallowcp1, long int *swallowcp2, U16 **deleteme)
{
/* a little state machine then */
/*
1) a hyperlink may or may not start with a space,
2) then a word HYPERLINK, though sometimes in another language i believe,
3) then another space,
4) after this usually theres a link
5) followed by an optional final space and an optional 0x01
but 4 might start with a space then \l then a space then a string then a
space.
--
so we need to get the full len of what we're dealing with, read it all in
then strip out the HYPERLINK portion, scan for a " \l ", remove it, also
remove any "0x01" and output the remainder.
as this eats the 0x14 we have to manually do the > in the calling function.
*/
/*if these are zero initialize them from the input*/
static long int from=-1;
static long to=-1;
static int no;
static U16 *array;
U16 *begin,*begin2;
static int state;
error(erroroutput,"incoming, letter is %c %x\n",letter,letter);
if (from == -1)
{
from = *swallowcp1;
to = *swallowcp2;
array = (U16 *) malloc (sizeof(U16) * ((to+1)-from));
if (array==NULL)
{
error(erroroutput,"no mem for hyperlink\n");
exit(-1);
}
}
switch(state)
{
case 0:
state=1;
break;
case 1:
if (letter == 0x20)
state=2;
break;
case 2:
if (letter != 0x01)
array[no++] = letter;
else
{
state=3;
if (letter != 0x14)
break;
else
no--;
}
/*let 0x14 fall into the next state*/
case 3:
if ((letter == 0x14) || (letter == 0x15))
{
state=0;
no--;
if (array[no] == ' ')
no--;
array[no+1] = '\0';
/*
error(erroroutput,"the current string is <!--%s-->\n",array);
*/
begin = array;
/*analyse this string looking for a backslash l, which for now
we will assume is always found as a space a blackslask an l and a space*/
if (array[0] == ' ')
if (array[1] == '\\')
if (array[2] == 'l')
if (array[3] == ' ')
{
begin = array+3;
if (array[4] == '\"')
{
*begin='\"';
*(begin+1)='#';
}
else
*begin='#';
}
error(erroroutput,"the current string is <!--");
begin2 = begin;
while (*begin2 != '\0')
error(erroroutput,"%c",*begin2++);
error(erroroutput,"-->\n");
from=-1;
to=-1;
no=0;
*deleteme = array;
return(begin);
}
break;
}
return(NULL);
}
/*
this attempts to parse the REF field that ms uses to encode
crosslink information
*/
U16 *decode_crosslink(int letter,long int *swallowcp1, long int *swallowcp2)
{
/* a little state machine then */
/*
1) a reference may or may not start with a space,
2) then a word PAGEREF, though ill not assume this
3) then another space
4) after this theres the name of the bookmark
5) followed by a space
6) there may be a few flags here e.g [\h] [\p] followed by
a space.
7) probably terminating 0x01
--
so we need to get the full len of what we're dealing with, read it all in
then strip out the HYPERLINK portion, scan for a " \l ", remove it, also
remove any "0x01" and output the remainder.
as this eats the 0x14 we have to manually do the > in the calling function.
*/
static int no=0;
static int state;
static long int from=-1;
static long int to=-1;
static U16 *array;
if (from == -1)
{
from = *swallowcp1;
to = *swallowcp2;
error(erroroutput,"a mallocing %d\n",(to+1)-from);
array = (U16 *) malloc (sizeof(U16) * ((to+1)-from));
if (array==NULL)
{
error(erroroutput,"no mem for hyperlink\n");
exit(-1);
}
}
switch(state)
{
case 0:
state=1;
break;
case 1:
if (letter == 0x20)
state=2;
break;
case 2:
if ((letter != 0x20) && (letter != 0x01) && (letter != 0x14))
array[no++] = letter;
else
{
state=0;
from=-1;
to=-1;
array[no] = '\0';
no=0;
return(array);
}
break;
}
return(NULL);
}